home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / texte / 7up_pd / avprot.c < prev    next >
C/C++ Source or Header  |  1998-10-29  |  11KB  |  471 lines

  1. /* AV-Protokoll */
  2. /*****************************************************************************
  3. *
  4. *                                              7UP
  5. *                                        Modul: AVPROT.C
  6. *                                     (c) by TheoSoft '90
  7. *
  8. *****************************************************************************/
  9. #include <portab.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <ctype.h>
  14. #include <aes.h>
  15. #include <vdi.h>
  16.  
  17. #include "alert.h"
  18.  
  19. #include "7up.h"
  20. #include "windows.h"
  21. #include "undo.h"
  22.  
  23. #if GEMDOS
  24. #include "vaproto.h"
  25. #include "dragdrop.h"
  26. #include <ext.h>
  27. #include <tos.h>
  28. #else
  29. #include <dir.h>
  30. #endif
  31.  
  32. #include "language.h"
  33.  
  34. extern long begline, endline;
  35. extern LINESTRUCT *begcut, *endcut;
  36. extern int cut;
  37. extern char AVName[];
  38.  
  39. long *get_cookie(long cookie);
  40. WINDOW *Wgetwp(char *filename);
  41. WINDOW *Wreadtempfile(char *filename, int mode);
  42.  
  43. /* AVSTUFF *****************************************************************/
  44.  
  45. #define AP_TERM        50      /* MultiTOS Shutdown */
  46. #define AP_TFAIL      51      /* Kein Shutdown */
  47. #define AP_RESCHG     57      /* Resolution change */
  48. #define SPOOLER_ACK  101
  49. #define AV_SENDKEY    0x4710
  50.  
  51. /***************************************************************************/
  52.  
  53. /* zerlegung des comdatastrings in commandvektor und commandcounter */
  54. int _get_args(int *argc, char *argv[], char *comdata)
  55. {
  56.     register int i;
  57.     register char c;
  58.  
  59.     *argc=1;
  60.     argv[0] = "";
  61.     for(i=1; i<MAXWINDOWS; )
  62.     {
  63.         while (isspace(*comdata))         /* führende blanks raus            */
  64.             comdata++;
  65.         if (*comdata == '\0')              /* kein argument                     */
  66.             break;
  67.         argv[i++] = comdata;          /* argvektor setzen                 */
  68.         while ( (*comdata != '\0') && (isspace(*comdata)==0)  )
  69.             comdata++;                         /* pointer hochzählen, solange  */
  70.                                                   /* nicht NULL oder blanks         */
  71.         c = *comdata;                         /* *comdata merken                  */
  72.         *comdata++ = '\0';                  /* den nächsten NULL setzen      */
  73.         if (c == '\0')                        /* und auf stringende testen     */
  74.             break;
  75.     }
  76.     *argc=i;
  77.     return(*argc-1);                             /* 0 wenn nur name */
  78. }
  79.  
  80. hndl_AVProt(int msgbuf[])
  81. {
  82.     char pathname[256],*clp;
  83.     struct ffblk fileRec;
  84.     WINDOW *wp;
  85.     int i,k,av_buf[8],overwrite=FALSE;
  86.     int kstate,gargc;
  87.     char *gargv[MAXWINDOWS+1];
  88.     /*static*/ char fpattern[FILENAME_MAX]="";
  89.     
  90.     extern int av_font;
  91.     extern int av_point;
  92.     extern int gl_apid,terminate_at_once;
  93.     extern char alertstr[];
  94.     extern OBJECT *winmenu;
  95.     extern WINDOW _wind[];
  96.  
  97. #if GEMDOS
  98.     if (AVProcessMsg(msgbuf))
  99.     {
  100.         for(i=1; i<MAXWINDOWS; i++)
  101.             if(_wind[i].w_state & OPENED)
  102.                 AVAccOpenedWindow(_wind[i].wihandle);
  103.     }
  104. #endif
  105.     switch(msgbuf[0])
  106.     {
  107. #if GEMDOS
  108.         case AC_OPEN:
  109. #if MiNT
  110.             wind_update(BEG_UPDATE);
  111. #endif
  112.             menu_bar(winmenu,TRUE);
  113. #if MiNT
  114.             wind_update(END_UPDATE);
  115. #endif
  116.             break;
  117.         case AP_TERM: /* MultiTOS shutdown */
  118.         case AP_RESCHG: /* Resolution change */
  119.             if(Wcount(CHANGED))
  120.             {
  121.                 av_buf[0]=AP_TFAIL;
  122.                 av_buf[1]=0;
  123.                 shel_write(10,0,0,(char *)av_buf,"");
  124.                 form_alert(1,Aavprot[2]);
  125.             }
  126.             else
  127.             {
  128.                 terminate_at_once=TRUE;
  129.                 exit(0);
  130.             }
  131.             break;
  132.         case AC_CLOSE:
  133. /*
  134. /* Reaktion auf AC_CLOSE */
  135.            for(i=1; i<MAXWINDOWS; i++)
  136.               if(_wind[i].w_state & OPENED)
  137.               {
  138.                   _wind[i].w_state &= ~OPENED;
  139.                   _wind[i].wihandle = -2;     /* AC_CLOSE-Kennung */
  140.               }
  141. */
  142.             break;
  143.         case SPOOLER_ACK:
  144.             if(wp=Wgettop())
  145.             {
  146.                 if(wp->kind & INFO)
  147.                     wind_set(wp->wihandle,WF_INFO,CALCLOCKMSG);
  148.                 else
  149.                     form_alert(1,Aavprot[3]);
  150.             }
  151.             else
  152.                 form_alert(1,Aavprot[3]);
  153.             break;
  154.         case AV_PROTOKOLL:
  155.             av_buf[0]=VA_PROTOSTATUS;
  156.             av_buf[1]=gl_apid;
  157.             av_buf[2]=0;
  158.             av_buf[3]=1|2|16; /* AV_SENDKEY + AV_ASKFILEFONT + AV_OPENWIND */
  159.             av_buf[4]=0;
  160.             av_buf[5]=0;
  161.             *(char **)(&av_buf[6])="7UP     ";
  162.             appl_write(msgbuf[1],16,av_buf);
  163.             break;
  164.         case AV_ASKFILEFONT:
  165.             av_buf[0]=VA_FILEFONT;
  166.             av_buf[1]=gl_apid;
  167.             av_buf[2]=0;
  168.             av_buf[3]=av_font; /* AV_ASKFILEFONT */
  169.             av_buf[4]=av_point;
  170.             appl_write(msgbuf[1],16,av_buf);
  171.             break;
  172.         case AP_DRAGDROP: /* MultiTOS Drag&Drop Protokoll */
  173.             pathname[0]=0;
  174.             rec_ddmsg(msgbuf,pathname);
  175.             goto DRAGDROPENTRY;  /* to be proofed */
  176.             break;
  177.         case    VA_DRAGACCWIND:
  178.             strcpy(pathname,*((char **)(&msgbuf[6])));/* Pfadname */
  179. DRAGDROPENTRY:
  180.             if((wp=Wp(msgbuf[3]))!=NULL)
  181.             {
  182.                 if(clp=strchr(pathname,' '))
  183.                     *clp=0;
  184.                 if(!cut && begcut && endcut)
  185.                 {  /* wenn was markiert, erst weg damit */
  186.                     overwrite=TRUE;
  187.                     graf_mouse(M_OFF,0L);
  188.                     Wcursor(wp);
  189.                     free_undoblk(wp,undo.blkbeg); /* Block weg */
  190.                     if((wp->w_state&COLUMN))
  191.                     {
  192.                         cut=cut_col(wp,begcut,endcut);
  193.                         undo.flag=copy_col(wp,begcut,endcut,&undo.blkbeg,&undo.blkend);
  194.                     }
  195.                     else
  196.                     {
  197.                         cut=cut_blk(wp,begcut,endcut);
  198.                         undo.flag=copy_blk(wp,begcut,endcut,&undo.blkbeg,&undo.blkend);
  199.                     }
  200.                     Wcuron(wp);
  201.                     Wcursor(wp);
  202.                     graf_mouse(M_ON,0L);
  203.                     free_blk(wp,begcut);
  204.                 }
  205.                 else
  206. /* nach Klemmbretteinschaltung kann noch ein Ramblock existieren */
  207.                     free_blk(wp,begcut);          /* ...weg damit */
  208.  
  209.                 if(_read_blk(wp,pathname,&begcut,&endcut)>0)
  210.                 {
  211.                     store_undo(wp, &undo, begcut, endcut, WINEDIT, overwrite?CUTPAST:EDITCUT);
  212.                     i=endcut->used;
  213.                     graf_mouse(M_OFF,0L);
  214.                     Wcursor(wp);
  215.                     if((wp->w_state&COLUMN))
  216.                         paste_col(wp,begcut,endcut);
  217.                     else
  218.                         paste_blk(wp,begcut,endcut);
  219.                     Wcursor(wp);
  220.                     graf_mouse(M_ON,0L);
  221.                     endcut->endcol=i;
  222.                     if(!(wp->w_state&COLUMN))
  223.                         hndl_blkfind(wp,begcut,endcut,SEAREND);
  224.                     else
  225.                         free_blk(wp,begcut); /* Spaltenblock freigeben */
  226.                 }
  227.                 begline=endline=0L;
  228.                 begcut=endcut=NULL;
  229.             }
  230.             else /* Fensterhandle -1, laut MTOS-Doku neues Fenster */
  231.             {
  232.                 if(*pathname)
  233.                 {
  234.                     if(_get_args(&gargc, gargv, pathname))
  235.                         for(i=1,k=1; i<gargc && k<MAXWINDOWS-Wcount(CREATED); i++)
  236.                             Wreadtempfile(strupr(gargv[i]),FALSE);
  237.                 }
  238.             }
  239.             break;
  240.         case VA_START:
  241.             if((msgbuf[3] || msgbuf[4]) && (clp=malloc(strlen(*((char **)(&msgbuf[3])))+1))!=NULL)
  242.             {
  243.                 strcpy(clp,*((char **)(&msgbuf[3])));              /* Pfadname */
  244.                 if(_get_args(&gargc, gargv, clp))
  245.                     for(i=1,k=1; i<gargc && k<MAXWINDOWS-Wcount(CREATED); i++)
  246.                         Wreadtempfile(strupr(gargv[i]),FALSE);
  247.               free(clp);
  248.             }
  249. #if MiNT
  250.             wind_update(BEG_UPDATE);
  251. #endif
  252.             menu_bar(winmenu,TRUE);
  253. #if MiNT
  254.             wind_update(END_UPDATE);
  255. #endif
  256.             break;
  257.         case AV_OPENWIND:
  258.             if(Wcount(CREATED)<(MAXWINDOWS-1))
  259.             {
  260.                 strcpy(pathname,*((char **)(&msgbuf[3])));              /* Pfadname */
  261.                 if(!strchr(*((char **)(&msgbuf[5])),'*') &&     /* Wildcard drin? */
  262.                     !strchr(*((char **)(&msgbuf[5])),'?') &&
  263.                     *(*((char **)(&msgbuf[5]))))      /* steht überhaupt was drin? */
  264.                 {
  265.                     strcat(pathname,*((char **)(&msgbuf[5])));
  266.                     Wreadtempfile(pathname,FALSE);
  267.                 }
  268.                 else /* ja, kein vollständiger Pfadname */
  269.                 {
  270.                     strcpy(fpattern,*((char **)(&msgbuf[5])));
  271.                     loadfiles(pathname,fpattern);
  272.                 }
  273.             }
  274.             av_buf[0]=VA_WINDOPEN;
  275.             av_buf[1]=gl_apid;
  276.             av_buf[2]=0;
  277.             av_buf[3]=0;
  278.             av_buf[4]=0;
  279.             appl_write(msgbuf[1],16,av_buf);
  280. #if MiNT
  281.             wind_update(BEG_UPDATE);
  282. #endif
  283.             menu_bar(winmenu,TRUE);
  284. #if MiNT
  285.             wind_update(END_UPDATE);
  286. #endif
  287.             break;
  288. #endif
  289.         case AV_SENDKEY:
  290.             hndl_keybd(msgbuf[3],msgbuf[4]);
  291.             break;
  292.     }
  293. }
  294.  
  295. #if GEMDOS
  296. int relay( int myid, int apid, int argc, char *argv[])
  297. {
  298.     char filename[FILENAME_MAX], *cp;
  299.     register int i;
  300.     static int av_buf[8]; /* muβ static sein, sonst weg! */
  301.  
  302.     for(i=1; i<argc; i++)
  303.     {
  304.         if((cp=strrchr(argv[i],'\\'))!=NULL || (cp=strrchr(argv[i],'/'))!=NULL)
  305.         {                                         /* Pfad und Namen trennen */
  306.             strcpy(filename,++cp);
  307.             *cp=0;
  308.             av_buf[0]=AV_OPENWIND;
  309.             av_buf[1]=gl_apid;
  310.             av_buf[2]=0;
  311.             *((char **)&av_buf[3])=argv[i];
  312.             *((char **)&av_buf[5])=filename;
  313.             if(appl_write(apid,16,av_buf)>0)
  314.             {
  315.                 do /* auf Anwort warten, wenn appl_write = OK */
  316.                 {
  317.                     evnt_mesag(av_buf);
  318.                 }
  319.                 while(av_buf[0]!=VA_WINDOPEN && av_buf[1]!=apid);
  320.             }
  321.             else
  322.             {
  323.                 form_alert(1,Aavprot[1]);
  324.                 return(FALSE); /* Fehler, hat nicht geklappt, aktiv bleiben */
  325.             }
  326.         }
  327.     }
  328.     if(argc==1) /* Menüleiste durch VA_START toppen lassen */
  329.     {
  330.         av_buf[0]=VA_START;
  331.         av_buf[1]=gl_apid;
  332.         av_buf[2]=0;
  333.         av_buf[3]=0;
  334.         av_buf[4]=0;
  335.         av_buf[5]=0;
  336.         av_buf[6]=0;
  337.         av_buf[7]=0;
  338.         appl_write(apid,16,av_buf);
  339.     }
  340.     return(TRUE);
  341. }
  342.  
  343. int appl_getinfo(int ap_gtype, int *ap_gout1, int *ap_gout2, int *ap_gout3, int *ap_gout4)
  344. {
  345.     AESPB aespb=
  346.     {
  347.         _GemParBlk.contrl,
  348.         _GemParBlk.global,
  349.         _GemParBlk.intin,
  350.         _GemParBlk.intout,
  351.         _GemParBlk.addrin,
  352.         _GemParBlk.addrout
  353.     };
  354.  
  355.     _GemParBlk.contrl[0] = 130;
  356.     _GemParBlk.contrl[1] = 1;
  357.     _GemParBlk.contrl[2] = 5;
  358.     _GemParBlk.contrl[3] = 0;
  359.     _GemParBlk.contrl[4] = 0;
  360.     
  361.     _GemParBlk.intin[0]  = ap_gtype;
  362.     
  363.     _crystal(&aespb);
  364.     
  365.     *ap_gout1 = _GemParBlk.intout[1];
  366.     *ap_gout2 = _GemParBlk.intout[2];
  367.     *ap_gout3 = _GemParBlk.intout[3];
  368.     *ap_gout4 = _GemParBlk.intout[4];
  369.     return(_GemParBlk.intout[0]);
  370. }
  371.  
  372. int appl_search( int ap_smode, char *ap_sname, int *ap_stype, int *ap_sid )
  373. {
  374.     AESPB aespb=
  375.     {
  376.         _GemParBlk.contrl,
  377.         _GemParBlk.global,
  378.         _GemParBlk.intin,
  379.         _GemParBlk.intout,
  380.         _GemParBlk.addrin,
  381.         _GemParBlk.addrout
  382.     };
  383.  
  384.     _GemParBlk.intin [0] = ap_smode;
  385.     _GemParBlk.addrin[0] = ap_sname;
  386.  
  387.     _GemParBlk.contrl[0]=18;    
  388.     _GemParBlk.contrl[1]=1;    
  389.     _GemParBlk.contrl[2]=3;    
  390.     _GemParBlk.contrl[3]=1;    
  391.  
  392.     _crystal(&aespb);
  393.  
  394.     *ap_stype = _GemParBlk.intout[1];
  395.     *ap_sid    = _GemParBlk.intout[2];
  396.  
  397.     return(_GemParBlk.intout[0]);
  398. }
  399.  
  400. #define MAXPAPPS 15
  401. #define APP_FIRST 0
  402. #define APP_NEXT  1
  403.  
  404. int My_appl_find(int my_id, char *ap_sname)
  405. {
  406.     int i, ap_stype, ap_sid;
  407.     char name[32];
  408.  
  409.     if(_GemParBlk.global[1] != 1)
  410.     {
  411.         if(get_cookie('MagX'))
  412.         {
  413.             if((ap_sid=appl_find(ap_sname))>=0 && ap_sid!=my_id)
  414.                 return(ap_sid);
  415.             for(i=(my_id+1); i<_GemParBlk.global[1]; i++)
  416.             {
  417.                 sprintf(name,"? %c",(char)i);
  418.                 name[1]=0;
  419.                 if((ap_sid=appl_find(name))==1)
  420.                     if(!strcmp(ap_sname,name))
  421.                         return(i);
  422.             }
  423.         }
  424.         if(_GemParBlk.global[0]>=0x0400)
  425.         {
  426.             if(appl_search( APP_FIRST, name, &ap_stype, &ap_sid )==1)
  427.             {
  428.                 if((ap_sid != my_id) && !strncmp(ap_sname,name,8))
  429.                     return(ap_sid);
  430.                 while(appl_search( APP_NEXT, name, &ap_stype, &ap_sid )==1)
  431.                 {
  432.                     if((ap_sid != my_id) && !strncmp(ap_sname,name,8))
  433.                         return(ap_sid);
  434.                 }
  435.             }
  436.         }
  437.         else
  438.         {
  439.             return(appl_find(ap_sname));
  440.         }
  441.     }
  442.     return(my_id);
  443. }
  444. #endif
  445.  
  446. #if GEMDOS
  447.  
  448. void AVExit(int myapid)
  449. {
  450.     int apid;
  451.     static int av_buf[8];
  452.  
  453.     if((apid=appl_find(AVName))>=0)
  454.     {
  455.         av_buf[0]=AV_EXIT;
  456.         av_buf[1]=myapid;
  457.         av_buf[2]=0;
  458.         av_buf[3]=myapid;
  459.         av_buf[4]=0;
  460.         av_buf[5]=0;
  461.         av_buf[6]=0;
  462.         av_buf[7]=0;
  463.         appl_write(apid,16,av_buf);
  464.     }
  465. /*
  466. printf("%d",c_pas(2));    
  467. */
  468. }
  469. #endif
  470.  
  471.